package temp.二叉树;

//给你一棵 完全二叉树 的根节点 root ，求出该树的节点个数。
//
// 完全二叉树 的定义如下：在完全二叉树中，除了最底层节点可能没填满外，其余每层节点数都达到最大值，并且最下面一层的节点都集中在该层最左边的若干位置。若最底层
//为第 h 层，则该层包含 1~ 2ʰ 个节点。
//
//
//
// 示例 1：
//
//
//输入：root = [1,2,3,4,5,6]
//输出：6
//
//
// 示例 2：
//
//
//输入：root = []
//输出：0
//
//
// 示例 3：
//
//
//输入：root = [1]
//输出：1
//
//
//
//
// 提示：
//
//
// 树中节点的数目范围是[0, 5 * 10⁴]
// 0 <= Node.val <= 5 * 10⁴
// 题目数据保证输入的树是 完全二叉树
//
//
//
//
// 进阶：遍历树来统计节点是一种时间复杂度为 O(n) 的简单解决方案。你可以设计一个更快的算法吗？
//
// Related Topics 树 深度优先搜索 二分查找 二叉树 👍 903 👎 0

import java.util.Deque;
import java.util.LinkedList;

/**
 * 完全二叉树的节点个数
 *
 * @author saint
 */
class P222_计算二叉树结点数 {
    public static void main(String[] args) {
        Solution solution = new P222_计算二叉树结点数().new Solution();

    }

    //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null){
            return 0;
        }
        Deque<TreeNode> queue = new LinkedList<>();
        queue.addLast(root);
        int num = 0;
        boolean flag = false;
        while (!queue.isEmpty()){
            int size = queue.size();
            while(size>0){
                TreeNode now = queue.removeFirst();
                num++;
                if (now.left != null) {
                    queue.addLast(now.left);
                }
                if (now.right != null) {
                    queue.addLast(now.right);
                }
                if(now.left == null || now.right == null){
                    flag = true;
                }
                size--;
            }
            if(flag){
                num+=queue.size();
                break;
            }
        }
        return num;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
